import fs from 'fs';
import path from 'path';
import protobuf from 'protobufjs';
import { promisify } from 'util';

// 获取当前模块所在目录路径的函数
function getDirname() {
    let dirPath =  path.dirname(new URL(import.meta.url).pathname).replace(/\\/g, '/');
    if (dirPath.startsWith('/')) {
        dirPath = dirPath.slice(1);
    }
    console.log('经过处理后的模块所在目录路径:', dirPath);
    // return dirPath
    // 向上一层目录获取项目根目录路径，假设scripts是根目录下的一级目录
    const projectRootDir = path.dirname(dirPath)
    return projectRootDir;
}

// 处理指定项目下pb目录中.proto文件的函数
async function processProtoFiles(projectName) {
  const dirname = getDirname();
  const protoDir = path.join(dirname,'src', 'apps', projectName, 'pb').replace(/\\/g, '/').replace(/^\/([A-Za-z])\:/, '$1:/');
//   console.log('拼接的.proto文件目录路径:', protoDir);
  const files = fs.readdirSync(protoDir);
  const result = {};

  for (const file of files) {
    if (path.extname(file) === '.md') {
        continue; // 如果是.md文件，直接跳过本次循环，不进行后续处理
    }
    const filePath = path.join(protoDir, file);  // 检查此处是否正确拼接文件路径
    // console.log('当前正在处理的.proto文件路径:', filePath);  // 添加日志输出
    // 使用protobufjs加载.proto文件
    const root = await protobuf.load(filePath);
    const messageTypes = root.nestedArray;
    const fileMessages = {};
    for (const messageType of messageTypes) {
      // 获取消息类型的名称和定义
      const messageTypeName = messageType.name;
      const messageTypeDefinition = messageType.toJSON();
      fileMessages[messageTypeName] = messageTypeDefinition;
    }
    // 以文件名（去掉扩展名）作为键，将该文件中的消息类型信息存入结果对象
    result[file.split('.')[0]] = fileMessages;
  }

  const outputPath = path.join(dirname,'src', 'apps', projectName, 'pb', 'index.json');
  await writeFile(outputPath, JSON.stringify(result, null, 2));
    // console.log(`Generated index.json successfully for project ${projectName}`);
  // 使用ANSI转义序列设置文本样式，这里设置为绿色前景色并加粗显示
  console.log(`\x1B[32m\x1B[1m文件处理成功！已为${projectName}生成 index.json 文件。\x1B[0m`);
}

const readFile = promisify(fs.readFile);
const writeFile = promisify(fs.writeFile);

// 解析命令行参数获取项目名
// const args = process.argv.slice(2);
// const projectArgIndex = args.findIndex(arg => arg.startsWith('--project='));
// if (projectArgIndex === -1) {
//   console.error('Please specify the project name using --project=projectName');
//   process.exit(1);
// }
// const projectName = args[projectArgIndex].split('=')[1];
const projectName = process.env['npm_config_project'] // 使用`--project=[module_name]`获取模块名

processProtoFiles(projectName).catch(err => {
  console.error('Error processing proto files:', err);
  process.exit(1);
});